package cn.j229.bug.zhongxuan.hualian.controller;

import cn.j229.bug.zhongxuan.hualian.exception.BusinessException;
import cn.j229.bug.zhongxuan.hualian.utils.JsonResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.UUID;

/**
 * @Author smile_ZhongXuan
 * @Date 2020/10/20 9:55
 * @Version 1.0
 */

@RestController
@RequestMapping("/upload")
public class UploadController {

    JsonResult jsonResult = new JsonResult();

    @PostMapping(value = "/uploadImage")
    public Map<String,Object> uploadImage(@RequestParam("file") MultipartFile multipartFile, HttpServletRequest request) throws IOException {
        // 空文件不能上传
        if(multipartFile.isEmpty()){
            throw new BusinessException("空文件不能上传！");
        }
        // 文件大小不能超过1M
        if(multipartFile.getSize() == 0){
            throw new BusinessException("文件大小不能超过1M！");
        }
        // 获得原始文件名
        String originalFilename = multipartFile.getOriginalFilename();
        System.out.println("originalFilename:"+originalFilename);    // 输出原文件名

        // 从原始文件名中获取后缀,作为新添加的文件的文件名后缀(匹配)
        String subfix = originalFilename.substring(originalFilename.lastIndexOf(".")+1);
        if(subfix.equals("png") || subfix.equals("jpg") || subfix.equals("jpeg") || subfix.equals("gif")){
            System.out.println("subfix:"+subfix);     // 输出文件的后缀名
            //使用UUID作为文件名,保证服务器中存放的文件名唯一
            String targetFile = UUID.randomUUID().toString().replace("-","")+"."+subfix;
            System.out.println("targetFile:"+targetFile);    // 输出替换后的文件名
            String fileName = "/usr/upload/hualian/image/"+targetFile;
            String returnWebAddress = "/image/"+targetFile;
            System.out.println("fileName:"+fileName);   // 输出文件完整地址
            //当项目挂载到服务器时存储图片
            // 通过目标（虚拟）路径和服务其中的真实路径进行映射
            //服务器中设置虚拟路径
            // 构建文件对象
            File uploadFile = new File(fileName);
            //核心操作(含有异常操作, 利用异常设定状态码(和前端约定)
            // 此处应当和ExceptionController结合, 当try执行成功则设定状态码0
            // 出现异常则设定其他
            // 再将异常信息结合BusinessException抛出, 交给ExceptionController处理
            try {
                multipartFile.transferTo(uploadFile);
            } catch (IOException e) {
                //e.printStackTrace();
                throw e;
            }
            jsonResult.put("文件上传成功",returnWebAddress);
            // 返回状态:200 表示上传成功
            jsonResult.setCode("200");
            // 返回服务器保存后的文件名
            return jsonResult.getValues();
        }else{
            System.out.println(subfix);
            throw new BusinessException("图片格式不合法！");
        }
    }
}
